<?php

/**
 *
 * @package php.ui.winbinder
 */

/**
 * Window System 클래스 
 * 
 * 1. 명령어 실행 
 * 2. 시스템(OS) 정보 가져오기 
 * 3. phpw 스크립트 실행 
 * 
 * 모든 메소드는 static 이다. 
 * 
 * @package php.ui.winbinder
 */
class WBSystem extends PObject { 

	/**
	 * Windows or system32 디렉토리에서 파일을 검색한다. 
	 *
	 * @param string $filename 검색될 파일 이름 
	 */ 
	public static function findFile($filename) { 
		return wb_fine_file($filename);
	}

	/**
	 * 명령어를 실행한다. 
	 *
	 * @param string $command 실행될 명령어 
	 * @param string $param 명령어에 들어가는 인수 
	 */
	public static function exec($command, $param = '') { 
		wb_exec($command, $param);
	}

	/**
	 * cmd 명령어 실행 , 명령어 실행창을 연다. 
	 * 
	 * 
	 */ 
	public static function command() { 
		WBSystem::exec("cmd");
	}

	/**
	 * 외부 브라우저를 이용하여 url을 실행한다. 
	 *
	 * @param string $url 이동할 url 
	 */
	public static function url($url) { 
		if (str_pos($url, 'http://') == false) { 
			$url  = "http://{$url}";
		}

		WBSystem::exec($url);
	}

	/**
	 * 메일 프로그램을 오픈 
	 *
	 * @param string $mailto 메일 주소 
	 */
	public static function mail($mailto) { 
		WBSystem::exec("mailto:{$mailto}");
	}

	/**
	 * 윈도우 시스템 명령어 실행 
	 *
	 * @param string $command 실행될 명령어 
	 * @param string $param 명령어 인수 
	 */
	public static function run($command, $param = '') { 
		WBSystem::exec(self::findFile($command), $param);
	}

	/** 
	 * 디렉토리 오픈 
	 * 
	 * @param string $dir 열릴 디렉토리, 공백일경우 현재 디렉토리 
	 */
	public static function open($dir = '') { 
		if (is_dir($dir) || $dir == '') { 
			WBSystem::exec($dir);
		}
	}

	/**
	 * phpw 스크립트 실행 
	 * 
	 * @param string $phpw 스크립트 파일 (.phpw)
	 * @param string $param 명령어 인수 
	 */ 
	public static function script($phpw, $param = '') { 
		if (strpos(strtolower($phpw), ".phpw") === false) { 
			echo "실행할 수 없는 파일 입니다.", PHP_EOL;
		} else { 
			WBSystem::exec($phpw, $param);
		}
	}

	/**
	 * phpw 스크립트로 실행한 윈도우의 인스턴스의 실행여부를 체크한다. 
	 *
	 * @param string $title 인스턴스가 생성된 윈도우 제목 
	 * @param bool $bring  true 이면 실행된 윈도우 인스턴스를 가지고 온다. 기본값은 false.
	 */
	public static function isRunInstance($title, $bring = false) { 
		return wb_get_instance($title, $bring);
	}

	/**
	 * 등록된 레지스트리 값을 가지고 온다. 
	 * 
	 * <code>
	 * // 메인키 종류 
	 * "HKCU" or "HKEY_CURRENT_USER"
	 * "HKLM" or "HKEY_LOCAL_MACHINE"
	 * "HKCR" or "HKEY_CLASSES_ROOT"
	 * "HKU" or "HKEY_USERS"
	 * "HKCC" or "HKEY_CURRENT_CONFIG"
	 * "HKD" or "HKEY_DYN_DATA"
	 * </code>
	 *
	 * @param string $key 메인 키 
	 * @param string $subkey 서브키
	 * @param string $entry 엔트리
	 * @return mixed 등록된 레지스트리 값 
	 * 
	 */
	public static function getRegistry($key, $subkey, $entry = '') { 
		return wb_get_registry_key($key, $subkey, $entry);
	}

	/**
	 * 레지스트리 값을 등록한다. 
	 * 
	 * @param string $key 메인 키 
	 * @param string $subkey 서브키
	 * @param string $entry 엔트리
	 * @param mixed $value 등록될 레지스트리 값 
	 *
	 */
	public static function setRegistry($key, $subkey, $entry = '', $value = null) { 
		return wb_set_registry_key($key, $subkey, $entry, $value);
	}

	/**
	 * Windows(OS) 시스템 정보를 얻어온다. 
	 * 
	 * <pre> 
	 * - appmemory (string)
	 *   The total memory used by the application
	 * 
	 * - commandline (string) 
	 *   The original Windows command line including the executable file
	 * 
	 * - computername (string) 
	 *   The name of the computer inside the network
	 * 
	 * - consolemode (integer)
	 *   1 indicates that console mode (DOS box) is active, 0 otherwise
	 * 
	 * - diskdrives (string) 
	 *   The list of all available disk drives
	 * 
	 * - exepath (string)
	 *   The path to the main executable (PHP.EXE)
	 * 
	 * - extensionpath (string) 
	 *   The path to the current PHP extension
	 * 
	 * - fontpath (string) 
	 *   The current font path
	 * 
	 * - freememory (integer)
	 *   The available physical memory
	 * 
	 * - gdiobjects (integer)
	 *   The number of currently allocated GDI handles
	 * 
	 * - instance (instance)
	 *   The instance identifier of the current application
	 * 
	 * - ospath (string)
	 *   The current OS path
	 * 
	 * - osversion (string) 
	 *   The complete OS version name
	 * 
	 * - osnumber (string) 
	 *   The numeric OS version number
	 * 
	 * - pgmpath (string)  
	 *   The default OS application path
	 * 
	 * - screenarea (string) 
	 *   The total area (x, y, width, height) of the screen, in pixels
	 *   ex) 0 0 1280 960
	 * 
	 * - systemfont (string)
	 *   The common (default) system font for dialog boxes
	 *   ex) Tahoma 8 Regular
	 * 
	 * - systempath (string)
	 *   The OS system path
	 * 
	 * - temppath (string) 
	 *   The path used by the OS to hold temporary files
	 * 
	 * - totalmemory (string) 
	 *   The total physical memory installed
	 * 
	 * - username (string) 
	 *   The name of the currently logged user
	 * 
	 * - userobjects (integer)
	 *   The number of currently allocated USER handles
	 * 
	 * - workarea (string) 
	 *   The valid area (x, y, width, height) of the screen, in pixels
	 *   ex) 0 0 1280 926
	 * </pre>
	 *
	 * @param string $info 시스템 정보 키워드 
	 */ 
	public static function info($info) { 
		return wb_get_system_info($info);
	}

	/**
	 * 폰트 정보를 가지고 온다. 
	 * 배열형태로 정리해서 가지고 온다. 
	 *
	 * 
	 * @return array font,size,type 의 연관 배열 
	 */ 
	public static function getFontInfo() { 
		$temp = explode(" ", WBSystem::info("systemfont"));

		return array(
			'font' => $temp[0],
			'size' => $temp[1],
			'type' => $temp[2],
		);
	}

	/**
	 * 화면 전체 해상도를 구한다.
	 *
	 * @return array x,y,width,height 의 연관배열 
	 */
	public static function getScreen() { 
		$temp = explode(" ", WBSystem::info("screenarea"));

		return array(
			'x'		=> $temp[0],
			'y'		=> $temp[1],
			'width'	=> $temp[2],
			'height' => $temp[3],
		);
	}

	/**
	 * 이용가능한 화면 해상도를 구한다. 
	 * 시작툴바를 제외한 크기를 구한다. 
	 *
	 * @return array x,y,width,height 의 연관배열 
	 */
	public static function getAvailableScreen() { 
		$temp = explode(" ", WBSystem::info("workarea"));
		$temp = array_map('intval', $temp);

		return array(
			'x'		=> $temp[0],
			'y'		=> $temp[1],
			'width'	=> $temp[2],
			'height' => $temp[3],
		);
	}

	/**
	 * 시스템 사운드를 재생한다. 
	 * 
	 * <pre>
	 * WBC_OK : Default system sound
	 * WBC_INFO : System information sound
	 * WBC_WARNING : Warning sound
	 * WBC_STOP : Error sound
	 * WBC_QUESTION : Question sound
	 * WBC_BEEP : 
	 * </pre>
	 * 
	 * @param int|string $style 상수 
	 */
	public static function play($style) { 
		wb_play_sound(wbconstant($style));
	}

	/**
	 * 키보드나 마우스 이베트가 일어날 때까지 시간을 딜레이 시킨다. 
	 *
	 * <code>
	 * // 키 입력이 있을 때 까지 딜레이 
	 * if (WBSystem::wait() == 27) {
	 *    echo "esc key pressed ";
	 * }
	 *
	 * // 5초 또는 keyboard 키를 눌렀을 때 
	 * WBSystem::wait($window, 5000, WBC_KEYDOWN)
	 * </code>
	 *
	 * @param handle $window winbinder 윈도우 핸들 
	 * @param int $pause 딜레이 시간 , 1000분의 1초 단위, ex) 5000 = 5초 
	 * @param int $flags 상수 WBC_MOUSEDOWN, WBC_MOUSEUP, WBC_KEYDOWN, WBC_KEYUP
	 * @param int key code 
	 */
	public static function wait($window  = 0 , $pause = 0 , $flags = 0 ) { 
		return wb_wait(wbinstance($window), $pause, wbconstant($flags));
	}
}
?>